//七、说说什么是浅拷贝，什么是深拷贝？

let obj = {
  a: 1,
  b: {
    c: 2,
  },
};

//1.浅拷贝：
let obj2 = { ...obj };
console.log(obj === obj2); //false
console.log(obj.b === obj2.b); //true

/**
 *
 * 浅拷贝如以上代码所示，只保证第一层的地址不同，而对象内如果还有对象则里面对象的地址相同
 *
 */

//2.深拷贝：
function deepClone(data) {
  if (typeof data !== "object" || data === null) {
    return data;
  }
  let tmp;
  if (data instanceof Array) {
    tmp = [];
  } else {
    tmp = {};
  }
  for (const key in data) {
    if (data.hasOwnProperty(key)) {
      tmp[key] = deepClone(data[key]);
    }
  }
  return tmp;
}

let obj3 = deepClone(obj);
console.log(obj === obj3);//false
console.log(JSON.stringify(obj3));//{"a":1,"b":{"c":2}}
console.log(obj.b === obj3.b);//false

/**
 * 
 * 深拷贝如以上代码所示
 * 它能够保证拷贝出来的对象本身的地址不同，并且里面的属性如果是对象，它的地址也不同
 * 一般项目中直接使用lodash，因为vue,react等高级框架的底层都会使用lodash,
 * 我们也不用单独安装它，项目自带lodash，很方便
 * 
 */